package com.mrl.stack;

/**
 * 实现栈
 * @author 正义君
 * @version 1.0
 */
public class ArrayStackDemo {
    public static void main(String[] args) {
        // 实例化一个栈对象
        ArrayStack arrayStack = new ArrayStack(10);
        // 向栈内压入元素
        arrayStack.push("1");
        arrayStack.push("2");
        // 查看栈内元素
        System.out.println("栈的内容:");
        arrayStack.list();
        // 查看栈顶元素
        System.out.println("栈顶元素为");
        System.out.println(arrayStack.get());
        // 从栈中取出元素
        System.out.println("从栈中取出元素");
        System.out.println(arrayStack.pop());
        System.out.println(arrayStack.pop());
        // 查看栈的大小
        System.out.println("这个栈的大小为:");
        System.out.println(arrayStack.size());
    }
}

class ArrayStack {
    // 栈
    private final String[] obj;
    // 栈顶
    private int top = -1;
    // 栈的大小
    private int size;

    /**
     * 构造器，创建一个大小为size的栈
     * @param size 栈的大小
     */
    ArrayStack(int size) {
        obj = new String[size];
        this.size = size;
    }

    /**
     * 构造器，创建一个大小为20的栈
     */
    ArrayStack() {
        obj = new String[20];
        this.size = 20;
    }

    /**
     * 判断栈是否满
     * @return 满为 true 否则为 false
     */
    public boolean isFull() {
        return top >= size - 1;
    }

    /**
     * 判断栈是否为空
     * @return 空为 true 否则为 false
     */
    public boolean isEmpty() {
        return top == -1;
    }

    /**
     * 向栈内加入一个元素  压栈
     * @param object 加入栈的对象
     */
    public void push(String object) {
        if (isFull()) {
            throw new RuntimeException("当前栈已满");
        }
        top ++;
        obj[top] = object;
    }

    /**
     * 从栈中取出一个元素  弹栈
     * @return 返回栈顶的一个元素
     */
    public String pop() {
        if (isEmpty()) {
            throw new RuntimeException("栈空");
        }
        return obj[top--];
    }

    /**
     * 查询栈的大小
     * @return 返回一个栈的长度
     */
    public int size() {
        return size;
    }

    /**
     * 获取栈顶元素，但不取出
     * @return 返回栈顶元素
     */
    public String get() {
        if (isEmpty()) {
            throw new RuntimeException("栈空");
        }
        return obj[top];
    }

    /**
     * 显示栈的内容
     */
    public void list() {
        if (isEmpty()) {
            throw new RuntimeException("栈空");
        }
        for (int i = top;i >= 0;i--) {
            System.out.printf("stack[%d]=%s\n", i, obj[i]);
        }
    }
}
